package pritace

import (
	"errors"
	"fmt"
	"math/rand"
	"time"
)

//递归函数调用
//斐波那契数列
func fibonacci(n int) (res int) {
	if n <= 2 {
		res = 1
	} else {
		res = fibonacci(n-1) + fibonacci(n-2)
	}
	return res
}

//数字阶乘
func Factorial(n uint64) (result uint64) {
	if n > 0 {
		result = n * Factorial(n-1)
		return result
	}
	return 1
}

var errDivisonByZero = errors.New("除数为0")

func div(dividend, divisor int) (int, error) {
	if divisor == 0 {
		return 0, errDivisonByZero
	}
	return dividend / divisor, nil
}

type ParseError struct {
	Filename string //文件名
	Line     int    //行号
}

func (e *ParseError) Error() string {
	return fmt.Sprintf("%s:%d", e.Filename, e.Line)
}

//创建一些解析错误
func newParseError(fileName string, line int) error {
	return &ParseError{fileName, line}
}

func TestError() {

	var e error
	// 创建一个错误实例，包含文件名和行号
	e = newParseError("main.go", 14)
	//通过error接口查看错误描述
	fmt.Println(e.Error())
    //根据错误接口具体的类型，获取详细错误信息
	switch detail := e.(type) {
	case *ParseError:
		fmt.Printf("Filename: %s Line: %d\n", detail.Filename, detail.Line)
	default:
		fmt.Println("other error")
	}
}

type Integer int

func (a Integer)Add(b Integer) Integer {
	return a+b
}

func (a *Integer)Add2(b Integer) Integer{
	return *a+b
}

func DebuggerAdd()  {
	var a Integer = 1
	var b Integer = 2
	var i interface{} = &a
	sum1 := i.(*Integer).Add(b)
	sum2 := i.(*Integer).Add2(b)
	fmt.Println(sum1)
	fmt.Println(sum2)

}

//获取函数的运行时间
func TestTime() {
	start := time.Now()
	sum := 0
	for i := 0; i < 1000000; i++ {
		sum++
	}
	elapsed := time.Since(start)
	fmt.Println("该函数执行完成耗时：", elapsed)
}

//传入不定参数
func ParamFunction(data1 int, data2 ...string) {
	fmt.Println(data1)
	for k,v := range data2 {
		fmt.Println(k,v)
	}

}

func init() {
	rand.Seed(time.Now().UnixNano())
}



